﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class WorkflowConfig
    {

        #region Variaveis Membros
        private int _idWfConfig;
        private TipoDocumento _tipoDocumento;
        private DateTime? _dataInicio;
        private DateTime? _dataFim;
        private StatusConfiguracaoWorkflow _status;
        private int _idContrato;
        
        private ProcessoContrato _processoContrato;
        private int _idProcessoContrato;

        private bool _executado;

        //private string _acaoEditar;
        private string _acaoDesativar;
        private string _txtExecutato;

        private GENTEEntities _context;
        #endregion

        #region Propriedades
        public int IdWfConfig
        {
            get { return _idWfConfig; }
            set { _idWfConfig = value; }
        }
        public TipoDocumento TipoDocumento
        {
            get { return _tipoDocumento; }
            set { _tipoDocumento = value; }
        }
        public DateTime? DataInicio
        {
            get { return _dataInicio; }
            set { _dataInicio = value; }
        }
        public DateTime? DataFim
        {
            get { return _dataFim; }
            set { _dataFim = value; }
        }
        public StatusConfiguracaoWorkflow Status
        {
            get { return _status; }
            set { _status = value; }
        }
        public int IdContrato
        {
            get { return _idContrato; }
            set { _idContrato = value; }
        }
        public ProcessoContrato ProcessoContrato
        {
            get { return _processoContrato; }
            set { _processoContrato = value; }
        }
        public int IdProcessoContrato
        {
            get { return _idProcessoContrato; }
            set { _idProcessoContrato = value; }
        }
        public bool Executado
        {
            get { return _executado; }
            set { _executado = value; }
        }
        //public string AcaoEditar
        //{
        //    get { return _acaoEditar; }
        //    set { _acaoEditar = value; }
        //}
        public string AcaoDesativar
        {
            get { return _acaoDesativar; }
            set { _acaoDesativar = value; }
        }
        public string TxtExecutato
        {
            get { return _txtExecutato; }
            set { _txtExecutato = value; }
        }
        #endregion

        #region Construtes
        public WorkflowConfig()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public WorkflowConfig(int idWfConfig)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idWfConfig);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idWfConfig)
        {
            try
            {
                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.id_configuracao_workflow == idWfConfig
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato,
                                   cw.tab_processo_contrato.id_processo_contrato,
                                   cw.executado
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idWfConfig = list.id_configuracao_workflow;
                    this._tipoDocumento = new TipoDocumento(list.Id_tipo_documento);
                    if (list.dt_inicio_configuracao != null)
                        this._dataInicio = list.dt_inicio_configuracao;
                    if (list.dt_fim_configuracao != null)
                        this._dataFim = list.dt_fim_configuracao;
                    this._status = new StatusConfiguracaoWorkflow(list.id_status_configuracao_workflow);
                    this._idContrato = list.Id_contrato;
                    this._idProcessoContrato = list.id_processo_contrato;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregaUltimoId()
        {
            try
            {
                List<WorkflowConfig> listWorkflowConfig = new List<WorkflowConfig>();

                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.tab_tipo_documento.Id_tipo_documento == this.TipoDocumento.IdTipoDocumento
                               && cw.dt_inicio_configuracao == this.DataInicio
                               && cw.dt_fim_configuracao == this.DataFim
                               && cw.tab_status_configuracao_workflow.id_status_configuracao_workflow == this.Status.IdStatusConfiguracaoWorkflow
                               && cw.tab_contrato.Id_contrato == this.IdContrato
                               && cw.tab_processo_contrato.id_processo_contrato == this.IdProcessoContrato
                               orderby cw.id_configuracao_workflow descending
                               select new
                               {
                                   cw.id_configuracao_workflow
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdWfConfig = list.id_configuracao_workflow;
                    break;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<WorkflowConfig> SelectAll()
        {
            try
            {
                List<WorkflowConfig> listWorkflowConfig = new List<WorkflowConfig>();

                var consulta = from cw in _context.tab_configuracao_workflow
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfig wfConfig = new WorkflowConfig();
                    wfConfig.IdWfConfig = list.id_configuracao_workflow;
                    wfConfig.TipoDocumento = new TipoDocumento(list.Id_tipo_documento);
                    if (list.dt_inicio_configuracao != null)
                        wfConfig.DataInicio = list.dt_inicio_configuracao;
                    if (list.dt_fim_configuracao != null)
                        wfConfig.DataFim = list.dt_fim_configuracao;
                    wfConfig.Status = new StatusConfiguracaoWorkflow(list.id_status_configuracao_workflow);
                    wfConfig.IdContrato = list.Id_contrato;

                    listWorkflowConfig.Add(wfConfig);
                }

                return listWorkflowConfig;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<WorkflowConfig> SelectPor(int idProcessoContrato)
        {
            try
            {
                List<WorkflowConfig> listWorkflowConfig = new List<WorkflowConfig>();

                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.tab_processo_contrato.id_processo_contrato == idProcessoContrato
                               orderby cw.dt_fim_configuracao, cw.tab_status_configuracao_workflow.descricao
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato,
                                   cw.executado,
                                   cw.tab_processo_contrato.id_processo_contrato
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfig wfConfig = new WorkflowConfig();
                    wfConfig.IdWfConfig = list.id_configuracao_workflow;
                    wfConfig.TipoDocumento = new TipoDocumento(list.Id_tipo_documento);
                    if (list.dt_inicio_configuracao != null)
                        wfConfig.DataInicio = list.dt_inicio_configuracao;
                    if (list.dt_fim_configuracao != null)
                        wfConfig.DataFim = list.dt_fim_configuracao;
                    wfConfig.Status = new StatusConfiguracaoWorkflow(list.id_status_configuracao_workflow);
                    wfConfig.IdContrato = list.Id_contrato;
                    wfConfig.ProcessoContrato = new ProcessoContrato(list.id_processo_contrato);
                    wfConfig.IdProcessoContrato = list.id_processo_contrato;

                    ////Botão Editar ou Visualizar
                    //wfConfig.AcaoEditar = "Visualizar";
                    //if (list.executado == "N")
                    //    if (list.id_status_configuracao_workflow != 2 && list.id_status_configuracao_workflow != 3)
                    //        wfConfig.AcaoEditar = "Editar";
                    
                    //Botão Desativar
                    wfConfig.AcaoDesativar = "";
                    if (list.id_status_configuracao_workflow != 2 && list.id_status_configuracao_workflow != 3)
                        wfConfig.AcaoDesativar = "Desativar";

                    if (list.executado == "S")
                    {
                        wfConfig.TxtExecutato = "Sim";
                        wfConfig.Executado = true;
                    }
                    else
                    {
                        wfConfig.TxtExecutato = "Não";
                        wfConfig.Executado = false;
                    }

                    listWorkflowConfig.Add(wfConfig);
                }

                return listWorkflowConfig;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<WorkflowConfig> SelectPor(int idTipoDocumento, int idContrato, int idProcessoContrato)
        {
            try
            {
                List<WorkflowConfig> listWorkflowConfig = new List<WorkflowConfig>();

                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.tab_processo_contrato.id_processo_contrato == idProcessoContrato
                               && cw.tab_contrato.Id_contrato == idContrato
                               && cw.tab_tipo_documento.Id_tipo_documento == idTipoDocumento
                               orderby cw.tab_status_configuracao_workflow.descricao, cw.dt_inicio_configuracao 
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato,
                                   cw.executado,
                                   cw.tab_processo_contrato.id_processo_contrato
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfig wfConfig = new WorkflowConfig();
                    wfConfig.IdWfConfig = list.id_configuracao_workflow;
                    wfConfig.TipoDocumento = new TipoDocumento(list.Id_tipo_documento);
                    if (list.dt_inicio_configuracao != null)
                        wfConfig.DataInicio = list.dt_inicio_configuracao;
                    if (list.dt_fim_configuracao != null)
                        wfConfig.DataFim = list.dt_fim_configuracao;
                    wfConfig.Status = new StatusConfiguracaoWorkflow(list.id_status_configuracao_workflow);
                    wfConfig.IdContrato = list.Id_contrato;
                    wfConfig.ProcessoContrato = new ProcessoContrato(list.id_processo_contrato);
                    wfConfig.IdProcessoContrato = list.id_processo_contrato;

                    ////Botão Editar ou Visualizar
                    //wfConfig.AcaoEditar = "Visualizar";
                    //if (list.executado == "N")
                    //    if (list.id_status_configuracao_workflow != 2 && list.id_status_configuracao_workflow != 3)
                    //        wfConfig.AcaoEditar = "Editar";

                    //Botão Desativar
                    wfConfig.AcaoDesativar = "";
                    if (list.id_status_configuracao_workflow != 2 && list.id_status_configuracao_workflow != 3)
                        wfConfig.AcaoDesativar = "Desativar";

                    if (list.executado == "S")
                    {
                        wfConfig.TxtExecutato = "Sim";
                        wfConfig.Executado = true;
                    }
                    else
                    {
                        wfConfig.TxtExecutato = "Não";
                        wfConfig.Executado = false;
                    }

                    listWorkflowConfig.Add(wfConfig);
                }

                return listWorkflowConfig;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<WorkflowConfig> SelectPor(int idTipoDocumento, int idContrato, int idProcessoContrato, int idStatus)
        {
            try
            {
                List<WorkflowConfig> listWorkflowConfig = new List<WorkflowConfig>();

                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.tab_processo_contrato.id_processo_contrato == idProcessoContrato
                               && cw.tab_contrato.Id_contrato == idContrato
                               && cw.tab_tipo_documento.Id_tipo_documento == idTipoDocumento
                               && cw.tab_status_configuracao_workflow.id_status_configuracao_workflow == idStatus
                               orderby cw.tab_status_configuracao_workflow.descricao, cw.dt_inicio_configuracao
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato,
                                   cw.executado,
                                   cw.tab_processo_contrato.id_processo_contrato
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfig wfConfig = new WorkflowConfig();
                    wfConfig.IdWfConfig = list.id_configuracao_workflow;
                    wfConfig.TipoDocumento = new TipoDocumento(list.Id_tipo_documento);
                    if (list.dt_inicio_configuracao != null)
                        wfConfig.DataInicio = list.dt_inicio_configuracao;
                    if (list.dt_fim_configuracao != null)
                        wfConfig.DataFim = list.dt_fim_configuracao;
                    wfConfig.Status = new StatusConfiguracaoWorkflow(list.id_status_configuracao_workflow);
                    wfConfig.IdContrato = list.Id_contrato;
                    wfConfig.ProcessoContrato = new ProcessoContrato(list.id_processo_contrato);
                    wfConfig.IdProcessoContrato = list.id_processo_contrato;

                    ////Botão Editar ou Visualizar
                    //wfConfig.AcaoEditar = "Visualizar";
                    //if (list.executado == "N")
                    //    if (list.id_status_configuracao_workflow != 2 && list.id_status_configuracao_workflow != 3)
                    //        wfConfig.AcaoEditar = "Editar";

                    //Botão Desativar
                    wfConfig.AcaoDesativar = "";
                    if (list.id_status_configuracao_workflow != 2 && list.id_status_configuracao_workflow != 3)
                        wfConfig.AcaoDesativar = "Desativar";

                    if (list.executado == "S")
                    {
                        wfConfig.TxtExecutato = "Sim";
                        wfConfig.Executado = true;
                    }
                    else
                    {
                        wfConfig.TxtExecutato = "Não";
                        wfConfig.Executado = false;
                    }

                    listWorkflowConfig.Add(wfConfig);
                }

                return listWorkflowConfig;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<WorkflowConfig> SelectAtivoPor(int idProcessoContrato)
        {
            try
            {
                List<WorkflowConfig> listWorkflowConfig = new List<WorkflowConfig>();

                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.tab_processo_contrato.id_processo_contrato == idProcessoContrato
                               && (cw.tab_status_configuracao_workflow.id_status_configuracao_workflow == 1 
                                    || cw.tab_status_configuracao_workflow.id_status_configuracao_workflow == 4)
                               orderby cw.dt_fim_configuracao, cw.tab_status_configuracao_workflow.descricao
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato,
                                   cw.executado,
                                   cw.tab_processo_contrato.id_processo_contrato
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfig wfConfig = new WorkflowConfig();
                    wfConfig.IdWfConfig = list.id_configuracao_workflow;
                    wfConfig.TipoDocumento = new TipoDocumento(list.Id_tipo_documento);
                    if (list.dt_inicio_configuracao != null)
                        wfConfig.DataInicio = list.dt_inicio_configuracao;
                    if (list.dt_fim_configuracao != null)
                        wfConfig.DataFim = list.dt_fim_configuracao;
                    wfConfig.Status = new StatusConfiguracaoWorkflow(list.id_status_configuracao_workflow);
                    wfConfig.IdContrato = list.Id_contrato;
                    wfConfig.ProcessoContrato = new ProcessoContrato(list.id_processo_contrato);
                    wfConfig.IdProcessoContrato = list.id_processo_contrato;

                    ////Botão Editar ou Visualizar
                    //wfConfig.AcaoEditar = "Visualizar";
                    //if (list.executado == "N")
                    //    if (list.id_status_configuracao_workflow != 2 && list.id_status_configuracao_workflow != 3)
                    //        wfConfig.AcaoEditar = "Editar";

                    ////Botão Desativar
                    //wfConfig.AcaoDesativar = "";
                    //if (list.id_status_configuracao_workflow != 2 && list.id_status_configuracao_workflow != 3)
                    //    wfConfig.AcaoDesativar = "Desativar";

                    if (list.executado == "S")
                    {
                        wfConfig.TxtExecutato = "Sim";
                        wfConfig.Executado = true;
                    }
                    else
                    {
                        wfConfig.TxtExecutato = "Não";
                        wfConfig.Executado = false;
                    }

                    listWorkflowConfig.Add(wfConfig);
                }

                return listWorkflowConfig;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool RetornaUltimoStatus(int idProcessoContrato)
        {
            try
            {
                bool status = false;

                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.tab_processo_contrato.id_processo_contrato == idProcessoContrato
                               && cw.tab_status_configuracao_workflow.id_status_configuracao_workflow == 1
                               orderby cw.id_configuracao_workflow
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    status = true;
                    break;
                }

                return status;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool RetornaExecutado(int idProcessoContrato)
        {
            try
            {
                bool status = false;

                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.tab_processo_contrato.id_processo_contrato == idProcessoContrato
                               && cw.tab_status_configuracao_workflow.id_status_configuracao_workflow == 1
                               orderby cw.id_configuracao_workflow
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato,
                                   cw.executado
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    if (list.executado == "S")
                        status = true;
                    break;
                }

                return status;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool RetornaConfigurado(int idProcessoContrato)
        {
            try
            {
                bool status = false;

                var consulta = from cw in _context.tab_configuracao_workflow
                               where cw.tab_processo_contrato.id_processo_contrato == idProcessoContrato
                               orderby cw.id_configuracao_workflow
                               select new
                               {
                                   cw.id_configuracao_workflow,
                                   cw.tab_tipo_documento.Id_tipo_documento,
                                   cw.dt_inicio_configuracao,
                                   cw.dt_fim_configuracao,
                                   cw.tab_status_configuracao_workflow.id_status_configuracao_workflow,
                                   cw.tab_contrato.Id_contrato,
                                   cw.executado
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    status = true;
                    break;
                }

                return status;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (_idWfConfig == 0)
                {
                    tab_configuracao_workflow tabWf = new tab_configuracao_workflow();
                    tabWf.tab_tipo_documentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_documento", "Id_tipo_documento", TipoDocumento.IdTipoDocumento);
                    tabWf.dt_inicio_configuracao = DataInicio;
                    tabWf.dt_fim_configuracao = DataFim;
                    tabWf.tab_status_configuracao_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_configuracao_workflow", "id_status_configuracao_workflow", Status.IdStatusConfiguracaoWorkflow);
                    tabWf.tab_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_contrato", "Id_contrato", IdContrato);
                    tabWf.tab_processo_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_processo_contrato", "id_processo_contrato", IdProcessoContrato);
                    tabWf.executado = "N";

                    _context.AddTotab_configuracao_workflow(tabWf);
                    _context.SaveChanges();

                    CarregaUltimoId();
                }
                else
                {
                    tab_configuracao_workflow tabWf = (from wf in _context.tab_configuracao_workflow
                                                       where wf.id_configuracao_workflow == _idWfConfig
                                                       select wf).First();

                    tabWf.tab_tipo_documentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_documento", "Id_tipo_documento", TipoDocumento.IdTipoDocumento);
                    tabWf.dt_inicio_configuracao = DataInicio;
                    tabWf.dt_fim_configuracao = DataFim;
                    tabWf.tab_status_configuracao_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_configuracao_workflow", "id_status_configuracao_workflow", Status.IdStatusConfiguracaoWorkflow);
                    tabWf.tab_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_contrato", "Id_contrato", IdContrato);
                    tabWf.tab_processo_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_processo_contrato", "id_processo_contrato", IdProcessoContrato);

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

    }
}
